Sự khác nhau giữa 2 tín hiệu Sigterm và Sigkill trong Linux?
Sigterm là gì và cách gửi tín hiệu như nào?
Trong hệ điều hành UNIX/LINUX, tín hiệu Sigterm được sử dụng để yêu cầu chấm dứt (terminate) hoạt động của một tiến trình (process). Bạn cũng có thể mường tượng ra từ này là ghép của “SIGNAL” và “TERMINATE“.
Sigterm được coi là một hình thức “soft kill”, bởi vì khi tiến trình nhận được tín hiệu Sigtermthì tiến trình đó có thể được phép bỏ qua hoạt động dừng tiến trình.
Điều đó có nghĩa, khi một ứng dụng được lập trình thường sẽ có phần lập trình xử lý với các signal Sigterm từ hệ điều hành. Quá trình này thường được gọi là “Graceful shutdown“. Nên nếu ứng dụng không có lập trình để xử lý các signal Sigterm hoặc cố tình không xử lý khi nhận tín hiệu Sigterm thì cho dù bạn cố gắng gửi hàng trăm tín hiệu Sigterm thì cũng vô vọng trong việc kill đi một process trên Linux.
Vậy thì một tiến trình nhận Sigterm sẽ có 3 trạng thái dễ thấy:
- Không phản ứng gì cả
- Dừng ngay lập tức
- Một thời gian ngắn sau sẽ dừng hoạt động. Trong thời gian đó tiến trình sẽ dọn dẹp các resource như database connection, tiến trình con,… (graceful shutdown).
Cách gửi tín hiệu Sigterm như nào?
Người sử dụng Linux có thể chủ động gửi tín hiệu SIGTERM đến với process có process id đã được xác định.
Cú pháp:
# kill -15 <process_id>
Sigkill là gì và gửi tín hiệu Sigkill
Tín hiệu SIGKILL được sử dụng để chấm dứt quá trình hoạt động của một tiến trình ngay lập tức. Tín hiệu này không thể bị từ chối hay bị ngăn cản bởi tiến trình được chỉ định. Đơn giản là vì tín hiệu sẽ đi thẳng đến kernel init. Từ đó Kernel init tiến hành dừng tiến trình ngay.
Tuy nhiên, không phải lúc nào kernel cũng có thể dừng quá trình hoạt động của tiến trình thành công trong vài tình huống. Ví dụ như tiến trình đang chờ đợi disk io, network,… từ đó kernel không có khả năng dừng tiến trình được. Khi đấy sẽ sinh ra các Zombie process ở trạng thái uninterruptible sleep.
Gửi tín hiệu Sigkill như thế nào?
Cú pháp:
# kill -9 <process_id>
Sự khác nhau giữa Sigterm và Sigkill trong Linux là gì?
Cả 2 tín hiệu signal đều sử dụng để chấm dứt hoạt động của một tiến trình trong Linux, vài điểm khác biệt giữa cả 2 được tóm gọn như sau :
- Sigterm yêu cầu tiến trình dừng hoạt động. Còn Sigkill thì chấm dứt hoạt động của tiến trình ngay lập tức. - Sigterm có thể được xử lý hoặc từ chối xử lý quá trình dừng hoạt động bởi tiến trình. Còn Sigkill thì không tiến trình có cơ hội ngăn chặn hay từ chối cả. - Sigterm sẽ không dừng hoạt động của tiến trình con. Còn Sigkill sẽ dừng hoạt động cả tiến trình cha và tiến trình con nếu có. - Sigkill dễ tạo ra các tiến trình ma (zombie process) vì tiến trình bị ngừng hoạt động sẽ không có cơ hội thông báo cho tiến trình cha hoặc tiến trình con về việc bị ngừng hoạt động.
Thông thường cách dừng hoạt động một tiến trình đúng đắn nên là dùng Sigterm trước. Trừ khi tiến trình đó không phản hồi, hoặc không xử lý Sigterm thì kill bằng Sigkill.
Bức tranh vui nhộn miêu tả sự khác nhau giữa 2 tín hiệu Sigterm và Sigkill trong Linux:
Mong là sau khi đọc xong bài viết này bạn đã hiểu rõ về Sigterm - Sigkill trong Linux và sự khác biệt giữa chúng. Phân biệt chúng không khó phải không nào?
Nguồn bài tham khảo: Cuongquach
Mọi người cùng tìm kiếm: sigterm, sigkill, signterm